<script>
// forEach

// 你来实现 forEach 的 Polyfill

/* Array.prototype.forEach = Array.prototype.forEach || function() {
  // forEach 的 Polyfill
} */

/* const arr = ['a', 'b']
const o = { age: 18 }


Array.prototype.forEach2 = function(callback, _this = window) {
  for(let i = 0; i < this.length; i ++) {
    callback.call(_this, this[i], i, this)
  }
}
arr.forEach2(function(item, index, originArr) {
  console.log(item,index, originArr, this)
}, o) */
// arr.forEach(console.log, o)


/* const arr = ['a', 'b']

Array.prototype.map2 = function(callback) {
  const newArr= []
  for(let i = 0; i < this.length ;i ++) {
    newArr.push(callback(this[i], i, this))
  }
  return newArr
}

const newArr= arr.map2((item, index, originArr) => {
  return '🍜' + item + '🤣'
})
console.log(newArr) */

// const arr = [1, 3, 5];

// 没有初始值
// 第 1 次
// acc => 1
// cur => 3
// 第 2 次
// acc => 4
// cur => 5


// 有初始值
// 第 1 次
// acc => 0
// cur => 1
// 第 2 次
// acc => 1
// cur => 3
// 第 3 次
// 4 + 5
/* const r = arr.reduce((acc, cur, curIndex) => {
  return acc + cur
}, 0)
console.log(r) */

const arr = [{
  num: 8
}, {
  num: 7
}, {
  num: 1
}]

Array.prototype.reduce2 = function(callback, acc) {
  let startIndex = 0
  if(typeof acc === 'undefined') {
    // 没有传，第一次 acc 应该是数组的第 0 项目
    acc = this[0]
    // 没有传，少循环 1 次
    startIndex = 1
  }
  for(let i = startIndex; i < this.length; i ++) {
    acc = callback(acc, this[i], i)
  }
  return acc
}

const r = arr.reduce2((acc, cur, curIndex) => acc + cur.num, 0)
console.log(r)
</script>